package com.hll.javaweb.servlet.basic;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

// 如果整个web服务器访问base url = http://localhost:8080/web
// 那么该api的访问路径为 http://localhost:8080/web/hello-servlet
// 原始做法：web.xml中配置
@WebServlet(name = "helloServlet", value = "/hello-servlet")
public class HelloServlet extends HttpServlet { // 继承自httpServlet，也可以Implements Servlet但不建议
  private Integer num = 0;

  @Override
  public void init() {
    System.out.println("helloServlet init...........");
  }

  // 还有其他的一些doPut,doDelete之类的请求
  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    System.out.println("helloServlet doPost");
    doGet(req, resp); // 交由get处理
  }

  // 以url访问默认是get
  @Override
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
    num++; // 不同的人访问这个api，都是同一个servlet实例

    // 请求等待了三秒才返回
    try {
    // 很有意思的现象，在同一个浏览器的情况下 有先后请求 get1,get2
      // get1会等待三秒，并且get2是在get1输出后过三秒才返回（此时get2没进入了doGet方法）
      // 在同一个浏览器的情况下（应该被看成了一个用户）是同步的
      // 但实际上 get1和get2的处理Thread不同!!,我也不知道为什么会同步。。。以后再看

      // 不同浏览器访问，是不同的线程，没有等对方结束后开始的情况
      // 这时会有线程安全问题： 例如 get1 sleep之前 num++ = 4, get2 :num = 5,
      // 但get1 sleep结束后返回的是5
      System.out.println(Thread.currentThread().getName() + " ........");
      Thread.sleep(3000);
    } catch (InterruptedException e) {
      throw new RuntimeException(e);
    }

    System.out.println("helloServlet doGet");

    response.setCharacterEncoding("utf-8"); // 务必在获取response之前设置
    response.setContentType("text/html"); // Mime类型

    // 服务端渲染，即输出html内容，不太建议
    PrintWriter out = response.getWriter();
    out.println("<html><body>");
    out.println("<h1>你好，世界！</h1>");
    out.println("<h1> num = " + num + "</h1>");
    out.println("</body></html>");
  }

  @Override
  public void destroy() {
    System.out.println("hello-servlet destroy.....");
  }
}
